Interne Tabelle zur Laufzeit generieren
Manchmal ist es notwendig und sinnvoll, eine interne Tabelle erst zur Laufzeit zu generieren. Wenn beispielsweise Berichtsdaten aus verschiedenen Jahren gegliedert ausgegeben werden sollen und für jedes Jahr eine eigene Spalte benötigt wird.
Sicherlich kann man eine bestimmte Anzahl von Spalten vorsehen und nicht benötigte Spalten bei der Ausgabe ausblenden… Eleganter ist jedoch die Verwendung der Methode cl_alv_table_create=>create_dynamic_table.
Mit ihre kann man anhand eines Feldkataloges eine interne Tabelle aufbauen:
CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = gt_fieldcatalog IMPORTING ep_table = gz_table EXCEPTIONS generate_subpool_dir_full = 1 OTHERS = 2.
Die Bearbeitung der Tabelle ist hinterher allerdings nicht mehr ganz einfach, da nicht mit Spaltennamen gearbeitet werden kann, denn die dynamisch zu generierenden Tabellenspalten kennt der Compiler ja noch nicht.
Es muss hier mit Feldsymbolen gearbeitet werden. Die einzelnen Felder des Arbeitsbereiches werden über den Index (ASSIGN COMPONENT <index>…) des Feldes oder über den Namen (ASSIGN COMPONENT ‘fieldname’…) angesprochen.
Beispiel-Coding
*** Feldkatalog DATA gt_fcat TYPE lvc_t_fcat. *** Datenreferenz für interne Tabelle DATA gz_table TYPE REF TO data. *** Feld-Symbole für: *>> Zeile des Feldkatalogs FIELD-SYMBOLS <fcat> TYPE lvc_s_fcat. *>> interne Tabelle FIELD-SYMBOLS <table> TYPE STANDARD TABLE. *>> Arbeitsbereich der internen Tabelle FIELD-SYMBOLS <workarea> TYPE ANY. *>> Feld des Arbeitsbereiches FIELD-SYMBOLS <field> TYPE ANY. *** Feldkatalog der internen Tabelle aufbauen: *1* VBELN APPEND INITIAL LINE TO gt_fcat ASSIGNING <fcat>. <fcat>-fieldname = 'VBELN'. <fcat>-tabname = 'GZ_TABLE'. <fcat>-ref_field = 'VBELN'. <fcat>-ref_table = 'VBAK'. *2* ERDAT APPEND INITIAL LINE TO gt_fcat ASSIGNING <fcat>. <fcat>-fieldname = 'ERDAT'. <fcat>-tabname = 'GZ_TABLE'. <fcat>-ref_field = 'ERDAT'. <fcat>-ref_table = 'VBAK'. START-OF-SELECTION. *** Interne Tabelle aus Feldkatalog generieren CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = gt_fcat IMPORTING ep_table = gz_table EXCEPTIONS generate_subpool_dir_full = 1 OTHERS = 2. *** Datenreferenz dem Feldsymbol <TABLE> zuweisen ASSIGN gz_table->* TO <table>. *** Testdaten in interne Tabelle einfügen APPEND '000001234520070107' TO <table>. APPEND '112233445520050608' TO <table>. *** Testdaten auslesen und als Liste ausgeben: LOOP AT <table> ASSIGNING <workarea>. *** Neue Zeile für jeden Tabelleneintrag NEW-LINE. *** Felder des Arbeitsbereiches ausgeben DO. ASSIGN COMPONENT sy-index OF STRUCTURE <workarea> TO <field>. IF sy-subrc > 0. *** Kein Feld mehr vorhanden EXIT. "from do ELSE. *** Feldwert ausgeben WRITE: <field> COLOR COL_TOTAL. ENDIF. ENDDO. ENDLOOP.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024